package sf.querydsl.mapper;

import com.querydsl.sql.AbstractSQLQuery;
import com.querydsl.sql.SQLQuery;
import sf.common.wrapper.Page;
import sf.core.DBObject;
import sf.database.dao.DBContext;
import sf.querydsl.SQLRelationalPath;

import java.util.List;
import java.util.function.Consumer;
import java.util.stream.Stream;

public interface QueryDSLMapper<T extends DBObject> {
    /**
     * @return
     */
    SQLRelationalPath<T> queryDSLTable();

    /**
     * @param context
     * @return
     */
    SQLRelationalPath<T> queryDSLTable(DBContext context);

    /**
     * @param query
     * @return
     */
    List<T> queryDSLSelectList(AbstractSQLQuery<T, SQLQuery<T>> query);

    /**
     * @param query
     * @param start
     * @param limit
     * @return
     */
    Page<T> queryDSLSelectPage(AbstractSQLQuery<T, SQLQuery<T>> query, int start, int limit);

    /**
     * @param query
     * @param clz
     * @param <S>
     * @return
     */
    <S> S queryDSLSelectOne(AbstractSQLQuery<T, SQLQuery<T>> query, Class<S> clz);

    /**
     * @param query
     * @return
     */
    T queryDSLSelectOne(AbstractSQLQuery<T, SQLQuery<T>> query);

    /**
     * @param ormIt
     * @param query
     */
    void queryDSLSelectIterator(Consumer<Iterable<T>> ormIt, AbstractSQLQuery<T, SQLQuery<T>> query);

    /**
     * @param ormStream
     * @param query
     */
    void queryDSLSelectStream(Consumer<Stream<T>> ormStream, AbstractSQLQuery<T, SQLQuery<T>> query);
}
